package dletc.demo;

import dletc.demo.demo01.Inner1;

public class demo01 {

	public static void main(String[] args) {
		/**
		 * 内部类：
		 * 1.什么是内部类：在类的内部又定义了一个新的类，被称为内部类   内部类可以被所有权限修饰符修饰
		 * 2.内部类的分类：	静态内部类：类似静态变量
		 * 					创建对象：外部类名.内部类名  变量名 = new 外部类名.内部类名();
		 * 					实例内部类：类似实例变量
		 * 					创建对象：  外部类    对象名  =   new  外部类（）          
            					         外部类.内部类  对象名 =  外部类对象名. new 内部类()                 
  									注意：非静态内部类要想调用成员，必须先要创建外部类对象 
		 * 				局部内部类：类似局部变量 （方法内、代码块内、构造器内）
		 * 3.使用内部类编写的代码，可读性很差，能不用尽量不用。
		 * 4.匿名内部类是局部内部类的一种  匿名就是没有名字
		 * 5.不建议使用，一个类没有名字不能重复使用，只能用一次，代码太乱，可读性太差。
		 * 6.内部类可以直接访问外部类的属性和方法，因为也在外部类中 省略的是 ：“类名.this.”
		 * 	   外部类调用内部类跟条用其他类一样  需要  “引用.” 或  “类名.”
		 * 
		 * 7内部类和外部类的区别：
			 * 内部类可以被static修饰，外部类不能被修饰
			 * 四种权限修饰符都可以修饰内部类。
		 */
		
		//匿名内部类展示
		MyMethod mm = new MyMethod();
		
		//创建computer的实现类进行匿名对象 调用
		//mm.mySum(new ComputerImpl(), 100, 200);
		//演示匿名内部类
		mm.mySum(new Computer(){
			public int sum(int a, int b) {
				return a + b;
			}
		}, 100, 200);

	}
	
	static class Inner1{} //静态内部类
	//调用静态内部类
	Inner1 a = new Inner1();
	
	class Inner2{} //实例内部类
	//调用实例内部类
	demo01 demo = new demo01();
	Inner2 b = demo.new Inner2();
	
	
	public void doSome(){ 
		class Inner3{} //局部内部类
	}

}


interface Computer{
	int sum(int a, int b);
}

/*class ComputerImpl implements Computer{

	@Override
	public int sum(int a, int b) {
		return a + b;
	}
	
}*/

class MyMethod{
	public void mySum(Computer c, int x , int y){
		System.out.println(x + "+" + y + "=" + c.sum(x, y));
	}
}












